/*
 *
 */
package server.thread;

import java.net.ServerSocket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import server.piles.Piles;

/**
 *
 * @author Sérgio C. Peres
 * @author Guilherme Alves
 */
public class HTTPServerPool extends server.http.HTTPServer{

    private ExecutorService pool;
    private Piles pilha;

    /**
     * Cria um servidor HTTP.
     * 
     * @param pathDir Diretorio base.
     * @param port Porta.
     */
    public HTTPServerPool(String pathDir, int port) {
        super(pathDir, port);
        HTTPThreadFactory tf = new HTTPThreadFactory();
        this.pool = Executors.newSingleThreadExecutor(tf);
        this.pilha = new Piles();
    }
    /**
     * Cria um servidor HTTP com numero fixo de thread.
     * 
     * @param pathDir Diretorio base.
     * @param port Porta.
     * @param sizePool Tamanho maximo do pool de threads.
     */
    public HTTPServerPool(String pathDir, int port, int sizePool) {
        super(pathDir, port);
        this.pool = Executors.newFixedThreadPool(sizePool);
    }   
    
    @Override
    public void run() {
        ServerSocket socketServidor = null;
        System.out.println("Servidor Iniciando...");
        
        try {
            System.out.println("Tentando alocar a porta... [" + getPort() + "]");
            socketServidor = new ServerSocket(getPort());
        } catch (java.io.IOException e) {
            System.out.println("Erro Fatal: " + e.getMessage());
            return;
        } catch (Exception e) {
            System.out.println("Erro Fatal: " + e.getMessage());
            return;
        }
        
        System.out.println("Servidor OK!");
        
        while (true) {
            System.out.println("Servidor Aguardando...");
            try {
                // Aceitando a uma requisição e a redirecionado para uma thread resolver
                pool.submit(new HTTPReply(this, socketServidor.accept()));
            } catch (java.io.IOException ex) {
                System.out.println("Erro de conexão: " + ex.getMessage());
                break;
            }
        }
    }

    public Piles getPilha() {
        return pilha;
    }
    
    
}